package com.itcast.yygh.hosp.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itcast.common.exception.YyghException;
import com.itcast.common.result.R;
import com.itcast.common.utils.MD5;
import com.itcast.yygh.hosp.service.HospSetService;
import com.itcast.yygh.model.model.hosp.HospitalSet;
import com.itcast.yygh.model.vo.hosp.HospitalSetQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;
import java.util.Random;

/**
 * 医院设置模块
 */
@Api("医院设置服务接口")
@RestController
@RequestMapping("/admin/hosp/hospSet")
//接口跨域问题
//@CrossOrigin
public class HospSetController {

    @Autowired
    private HospSetService hospSetService;

    //查询所有数据方法用来测试项目环境
    @ApiOperation("医院设置列表方法")
    @GetMapping("/findAll")
    public R findAll(){
        //调用service中的方法
        List<HospitalSet> list = hospSetService.list();
        return R.ok().data("list",list);
    }

    //医院设置逻辑删除方法
    @ApiOperation("医院设置逻辑删除方法")
    @DeleteMapping("/delHosp/{id}")
    public R delHosp(@ApiParam(name="id",value = "医院设置id",required = true) @PathVariable Integer id){
        try{
            hospSetService.removeById(id);
        }catch (Exception e){

            e.printStackTrace();
            return R.error().message("医院设置逻辑删除失败!");
        }
        return R.ok();
    }
    //医院设置列表分页方法
    @ApiOperation("医院设置列表分页查询(不带条件)")
    @GetMapping("/findPage/{page}/{limit}")
    public R findPage(
            @ApiParam(name = "page",value = "医院设置分页列表当前页",required = true)
            @PathVariable(name = "page") Long page,
            @ApiParam(name = "limit",value = "医院设置分页列表条数",required = true)
            @PathVariable(name = "limit") Long limit){
        //创建分页对象
        Page<HospitalSet> pages = new Page<>(page,limit);
        //执行分页查询操作
        hospSetService.page(pages,null);
        //将数据进行封装
        //获取数据总条数
        long total = pages.getTotal();
        //获取每页显示的条数
        List<HospitalSet> records = pages.getRecords();

        //返回查询的数据
        return R.ok().data("total",total).data("rows",records);
    }
    //医院设置列表分页方法带条件查询
    @ApiOperation("医院设置列表分页查询(带条件)")
    @PostMapping("/findPages/{page}/{limit}")
    public R findPages(
            @ApiParam(name = "page",value = "医院设置分页列表当前页",required = true)
            @PathVariable(name = "page") Long page,
            @ApiParam(name = "limit",value = "医院设置分页列表条数",required = true)
            @PathVariable(name = "limit") Long limit,
            //查询的条件
            @RequestBody(required=false) HospitalSetQueryVo hospitalSetQueryVo
            ){
        //创建分页对象
        Page<HospitalSet> pages = new Page<>(page,limit);
        //需要带上条件进行分页查询
        QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>();
        //判断分页查询的时候是否带条件
        if(hospitalSetQueryVo==null){
            //执行分页查询操作
            hospSetService.page(pages,queryWrapper);
        }else{
            //拼接查询条件
            String hosname = hospitalSetQueryVo.getHosname();
            String hoscode = hospitalSetQueryVo.getHoscode();

            if(!StringUtils.isEmpty(hosname)){
                queryWrapper.like("hosname",hosname);
            }
            if(!StringUtils.isEmpty(hoscode)){
                queryWrapper.eq("hoscode",hoscode);
            }
            hospSetService.page(pages,queryWrapper);
        }

        //将数据进行封装
        //获取数据总条数
        long total = pages.getTotal();
        //获取每页显示的条数
        List<HospitalSet> records = pages.getRecords();

        //返回查询的数据
        return R.ok().data("total",total).data("rows",records);
    }
    //医院设置数据的添加功能
    @ApiOperation("医院设置添加功能")
    @PostMapping("/saveHospSet")
    public R saveHospSet(
            @ApiParam(name="hospitalSet",value = "医院设置对象",required = true)
            @RequestBody HospitalSet hospitalSet
                ){
        //1.需要设置医院设置数据的状态   status  1  在用  0 不能用
        hospitalSet.setStatus(1);
        //2.设置秘钥signKey
        Random random = new Random();
        hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+""+random.nextInt(1000)));
        try{
            //3.进行保存操作
            hospSetService.save(hospitalSet);
        }catch (Exception e){
            e.printStackTrace();
            return R.error().message("保存医院设置数据失败!");
        }
        //4.返回操作的结果
       return R.ok().message("保存医院设置数据成功!");
    }
    //要进行修改操作，首先先查询医院数据进行数据的回显
    @ApiOperation("根据id查询医院数据")
    @GetMapping("/getHospSet/{id}")
    public R getHospSet(
            @ApiParam(name = "id",value = "医院设置id",required = true)
            @PathVariable String id
                    ){
        /*try {
            int a = 10/0;
        }catch(Exception e) {
            throw new YyghException(20001,"出现自定义异常");
        }*/
            //根据id查询医院设置数据
        HospitalSet hospitalSet = hospSetService.getById(id);
        return R.ok().data("item",hospitalSet);
    }
    //实现医院数据的修改操作
    @ApiOperation("修改医院设置数据")
    @PostMapping("/updateHospSet")
    public R updateHospSet(
            @ApiParam(name = "hospitalSet",value = "医院设置数据带id",required = true)
            @RequestBody HospitalSet hospitalSet
            ){
        //直接调用方法执行更新操作
        try{
            hospSetService.updateById(hospitalSet);
        }catch (Exception e){
            e.printStackTrace();
            return R.error().message("医院设置修改操作失败!");
        }
        return R.ok().message("医院设置修改操作成功!");
    }
    //医院设置批量删除功能实现
    //注意批量删除是进行多条数据的删除,需要传入多个id,可以使用集合来进行接收
    @ApiOperation("医院设置批量删除功能")
    @DeleteMapping("/delHospSet")
    public R delHospSet(
            @ApiParam(name ="idList",value = "医院设置id",required = true)
            @RequestBody List<Long> idList
                ){
        //调用批量删除的方法
        try{
            hospSetService.removeByIds(idList);
        }catch (Exception e){
            e.printStackTrace();
            return R.error().message("医院数据删除失败!");
        }
       return R.ok().message("医院数据删除成功！");
    }
    //医院设置锁定/解锁功能的实现  前端会传过来数据的id和锁定的状态
    @ApiOperation("医院设置锁定解锁功能")
    @GetMapping("/lockHospitalSet/{id}/{status}")
    public R lockHospitalSet(
            @ApiParam(name = "id",value = "医院设置id",required = true)
            @PathVariable("id")Long id,
            @ApiParam(name = "status",value = "医院设置的状态",required = true)
            @PathVariable("status")Integer status
    ){
        //根据id查询医院的设置数据
        HospitalSet hospitalSet = hospSetService.getById(id);
        if(Objects.isNull(hospitalSet)){
            return R.error().message("请传入正确的id值!");
        }
        //设置要更新的状态
        hospitalSet.setStatus(status);
        //更新数据
        try{
            hospSetService.updateById(hospitalSet);
        }catch (Exception e){
            e.printStackTrace();
            return R.error().message("医院设置锁定/解锁失败!");
        }
        return R.ok().message("医院设置锁定/解锁成功!");
    }
}
